<?php
/**
 *
 * JS, CSS 파일 Packing 관리 class
 *
 * @author hmkim <gudals@gmail.com>
 *
 */

//require_once('Packer/class.JavaScriptPacker.php');

class utilPacker
{
    public static function js($jsName, $aJs = array())
    {
        // js packing file path
        $jsStaticPath = SC_DIR_HTML.'/js/static/';
        $jsPackPath = SC_DIR_RESOURCE.'/pack/js/';

        $aJsPacking = array();
        // 변화가 없을 경우 기존 그대로 사용한다. false 일 때...
        $isNewPacking = false;

        $aJsFile = self::getJsFiles($aJs);
        for ($i = 0; $i < count($aJsFile); $i++) {
            $_jsFile = $aJsFile[$i];

            // 기존 패킹 파일
            $packJsFile = $jsPackPath.basename($_jsFile);

            // 패킹 파일이 없거나 오래된 파일이므로 다시 생성 해야 함.
            if (self::isMakeFileCheck($_jsFile, $packJsFile) === true) {
                // 파일 패킹
                $packJsContents = self::packer($_jsFile);
                file_put_contents($packJsFile, $packJsContents);

                // 하나의 파일로 패킹하기 위해 따로 설정
                $aJsPacking[] = $packJsContents;

                if ($isNewPacking === false) $isNewPacking = true;

            } else {
                // 기존 그대로 사용 가능한 상태
                $aJsPacking[] = file_get_contents($packJsFile);
            }
        }

        $jsLoadFileName = $jsName.'.min.js';
        $jsPackLoadFile = $jsStaticPath.basename($jsLoadFileName);
        // 패킹 내용을 새로 만든다.
        // 파일이 없을 경우도 만든다.
        if ($isNewPacking === true || !file_exists($jsPackLoadFile)) {
            $_jsContents = implode(" ", $aJsPacking);
            file_put_contents($jsPackLoadFile, $_jsContents);
        }

        return $jsLoadFileName;
    }

    /**
     *
     * JS 패킹
     * @param string $jsFile
     */
    public static function packer($jsFile)
    {
        $packer = new utilPackerJs(file_get_contents($jsFile), '0', true, false);

        return $packer->pack();
    }

    /**
     *
     * css 파일 패킹
     * @param string $cssName 패킹할 파일 명
     * @param array $aCss 패킹할 css 파일 리스트
     * @return string
     */
    public static function css($cssName, $aCss = array())
    {
        // css packing file path
        $cssStaticPath = SC_DIR_HTML.'/style/static/';
        $cssPackPath = SC_DIR_RESOURCE.'/pack/style/';

        $aCssPacking = array();
        // 변화가 없을 경우 기존 그대로 사용한다. false 일 때...
        $isNewPacking = false;

        $aCssFile = self::getCssFiles($aCss);
        for ($i = 0; $i < count($aCssFile); $i++) {
            $_cssFile = $aCssFile[$i];

            // 기존 패킹 파일
            $packCssFile = $cssPackPath.basename($_cssFile);

            // 패킹 파일이 없거나 오래된 파일이므로 다시 생성 해야 함.
            if (self::isMakeFileCheck($_cssFile, $packCssFile) === true) {
                // 파일 패킹
                $packCssContents = utilPackerCss::minify(file_get_contents($_cssFile));
                file_put_contents($packCssFile, $packCssContents);

                // 하나의 파일로 패킹하기 위해 따로 설정
                $aCssPacking[] = $packCssContents;

                if ($isNewPacking === false) $isNewPacking = true;

            } else {
                // 기존 그대로 사용 가능한 상태
                $aCssPacking[] = file_get_contents($packCssFile);
            }
        }
        
        /*
        $_cssContents = implode(" ", $aCssPacking);
        return $_cssContents;
        exit;
        */

        $cssLoadFileName = $cssName.'.min.css';
        $cssPackLoadFile = $cssStaticPath.basename($cssLoadFileName);
        // 패킹 내용을 새로 만든다.
        // 파일이 없을 경우도 만든다.
        if ($isNewPacking === true || !file_exists($cssPackLoadFile)) {
            $_cssContents = implode(" ", $aCssPacking);
            file_put_contents($cssPackLoadFile, $_cssContents);
        }

        return $cssLoadFileName;
        //return $_cssContents;
    }

    /**
     *
     * 패킹할 js 파일 리스트
     * @param array $aJs
     * @return multitype:string
     */
    public function getJsFiles($aJs)
    {
        $aJsFile = array();

        // 기본 파일 세팅 (순서대로)
        // 공통으로 사용할 css 가 있을 경우 base.js 처럼 지정
        //$aJsFile[] = SC_DIR_HTML.'/js/lib/jquery.js';
        //$aJsFile[] = SC_DIR_HTML.'/js/base.js';

        foreach ($aJs as $key => $sJs) {
            if (empty($sJs)) continue;

            $_jsFile = SC_DIR_HTML.'/js/'.$sJs.'.js';
            if (!file_exists($_jsFile)) {
                __d('[CSS FILE NOT FOUND] '.$_jsFile);
                //continue;
            }

            $aJsFile[] = $_jsFile;
        }

        return $aJsFile;
    }

    /**
     *
     * 패킹할 css 파일 리스트
     * @param array $aCss
     * @return multitype:string
     */
    public function getCssFiles($aCss)
    {
        //if (empty($aCss)) return false;

        $aCssFile = array();

        // 기본 파일 세팅 (순서대로)
        // 공통으로 사용할 css 가 있을 경우 common.css 처럼 지정
        $aCssFile[] = SC_DIR_HTML.'/style/common.css';

        // 지정한 파일 세팅
        foreach ($aCss as $key => $sCss) {
            if (empty($sCss)) continue;

            $_cssFile = SC_DIR_HTML.'/style/'.$sCss.'.css';
            if (!file_exists($_cssFile)) {
                __d('[CSS FILE NOT FOUND] '.$_cssFile);
                //continue;
            }

            $aCssFile[] = $_cssFile;
        }

        return $aCssFile;
    }

    /**
     * 패킹된 파일이 오래 된 파일인지 확인
     * 기존 패킹된 파일보다 현재 파일이 나중에 생성된거면 다시 생성해야 한다.
     * @param string $sourceFile
     * @param string $packingFile
     * @return boolean
     */
    public function isMakeFileCheck($sourceFile, $packingFile)
    {
        if (!file_exists($packingFile)) return true;

        return (filemtime($packingFile) < filemtime($sourceFile)) ? true : false;
    }
}